package 案例;

/**
 * 多线程访问相同资源
 * <p>
 * 经典问题 ： 购票问题
 * 1 : 我们发现最大的问题
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/6/30 下午8:46
 */
public class HuoChe implements Runnable {

    /**
     * 用来表示我们票
     */
    private int ticketNo = 15;

    @Override
    public void run() {
        //一直出票
        while (true) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            synchronized (this) {
                if (ticketNo <= 0) {
                    break;
                }
                System.out.printf("线程%s购买到了第%d张票\n", Thread.currentThread().getName(), ticketNo--);
            }

        }
    }

    public static void main(String[] args) {
        //首先我们开启主线程 点击run

        //我们创建购票系统实例
        HuoChe huoChe = new HuoChe();

        //我们开启一个线程 购票点为哈尔滨站
        new Thread(huoChe, "哈尔滨站").start();

        //我们再开启一个购票点 哈尔滨北站
        new Thread(huoChe, "哈尔滨北站").start();
        new Thread(huoChe, "哈尔滨北站1").start();
        new Thread(huoChe, "哈尔滨北站2").start();
    }

}
